Date : 9 mars 1990
Programme : RAPIDFILE V1.1 ( Version Francaise )
Outils : TURBO DEBUGER V1.5 et PCTOOLS
Protection : MESSAGE DE PRESENTATION
Soci�t� : ASHTON TATE + COMMANDE ELECTRONIQUE
Fichier : RF.COM
Temps pass� :
Divers :
Origine : ?
Num�ro : 007
But: Enlever le message d'introduction de LA COMMANDE ELECTRONIQUE.
Premi�res constatations:
- Impossible de trouver un seul mot du message dans le fichier �
l'aide de PCTOOLS.
- Le programme ne se d�ssassemble pas avec SOURCER V2.
- PERISCOPE se plante m�me avec RUN.COM.
- On arrive avec QUAID � trouver entre quelle et quelle
interruption le message complet s'affiche.
- Il est impossible en mode pas � pas de s'arr�ter sur l'affichage
du message aussi bien avec QUAID qu'avec TURBO DEBUGGER: d�s la
premi�re ligne d'affichage le programme s'ex�cute enti�rement.
- En faisant du pas a pas avec TD on s'apercoit que le code n'est
jamais le m�me lorsqu'on passe une deuxi�me fois au m�me endroit!
En fait souvent le programme saute au milieu d'une instruction ce
qui modifie compl�tement le code qui suit!
- Aucune interruption n'est utilis�e pour sortir les caract�res
( ni l'INT 21 ni l'INT 10 - cel� aurait �t� trop facile ). Tout
laisse � supposer que l'on adresse directement la m�moire �cran.
Ca promet.
En essayant succ�ssivement plusieurs "manip" je m'apercois qu'en
lancant le programme par F9 ( TD ) j'arrive � l'interrompre en
faisant CONTROL BREAK. Et je me retrouve dans la boucle
d'affichage!
En me servant de F8 ( execution de sous-programme et d'INT ) ainsi
que de F4 ( executer le programme jusqu'au curseur ) je m'apercois
que tout se passe dans le CALL 363E ( CS:368F ): affichage d'une
ligne � chaque fois.
En 'd�cortiquant' le CALL 363E je tombe sur 3 autres CALL avant le
RET.
.
.
POP AX
CALL 35A2
PUSH AX
.
CALL 368F ����>.
. <��������ͻ .
. � .
. � CALL 1DF3 ; Lecture IN AL,03DA Ecriture OUT 03D8,AL
. � . ; adresses registres de la carte graphique
. � CALL 2106 ; Les lignes sont affich�es ici une par
� ; une.
� CALL 1E20 ; Ecriture adresse carte graphique OUT
� ; 03D8,AL
� .
� .
�� RET
Le premier et le troisi�me CALL ne servent qu'� tester la carte
vid�o pour n'envoyer les caract�res qu'en dehors d'un balayage
ligne. ( Compatibilit� avec les premi�res cartes CGA et
MONOCHROMES cel� �vite un d�chirement de l'image - Les cartes
EGA/VGA n'ont pas ce d�faut. )
La premi�re id�e est de supprimer le CALL central...et cel�
fonctionne parfaitement pour supprimer le message d'entr�. Mais
chose curieuse on se retrouve avec un RAPIDFIL qui affiche des
fen�tres vid�es de tout texte! Bravo l'id�e d'afficher tout ce qui
ressemblait � un caract�re ASCII dans le soft � l'aide du m�me CALL
est assez g�nial.
Le CALL 2106 comporte une boucle qui tourne 80 fois ( 1 ligne de 80
caract�res ) 50h dans CX avec un LODSB ( load byte de DS:SI -> AL )
suivi d'un STOSW ( store word vers ES:DI ) et DI contient B800 cad
l'adresse de la m�moire �cran.
MOV CX,50
LODSB
STOSW
LOOP
Donc ne pouvant pas modifier la sortie sans alt�rer la suite du
programme, j'essaie de trouver d'ou vienne les caract�res. Je DUMP
le contenu de DS:SI SI=341C et je "vois" effectivement la ligne
apparaitre avant d'etre affich�e sur 80 caract�res � partir de
DS:SI. A l'aide de l'instruction ALT-P je remonte le programme en
sens inverse afin de localiser l'endroit d'ou la ligne est tir�e.
Apr�s plusieurs essais je tombe sur un CALL 35A2 situ� avant mon
CALL principal 36F8.
En approffondissant le CALL 35A2 on voit qu'en fait le message et
tout les textes du soft sont �parpill�s lettre par lettre dans le
fichier.
Le tout est reconstitu� ligne par ligne par 2 boucles imbriqu�es
relativement complexes. J'ai sorti la routine pour la faire se
d�rouler au pas � pas par VISIBLE COMPUTER 80286 et ainsi
visualiser les registres et les diff�rentes zones m�moire.
Les caract�res sont appel�s par groupe de 3,2,4,6,5 de n'importe
quel endroit du fichier pour �tre mis bout � bout � partir de 341C.
On remarque une chose int�rressante; avant l'appel du CALL 35A2 on
charge AX ( POP ) et � la sortie du programme on le sauve sur la
pile ( PUSH ). AX commence � la valeur 19h pour �tre incr�ment�
ligne par ligne jusqu'� 2Eh. On retrouve donc les 25 lignes de
l'�cran.
Ne pouvant pas modifier les caract�res sous peine de modifier
l'affichage de la suite du programme, l'id�e vient d'emp�cher la
sortie ligne par ligne pendant les 25 premi�res lignes du programme
Bonne id�e, mais le programme ne se d�ssassemblant pas il est
impossible d'y rajouter du code � moins de jongler avec les HEADER,
PSP, etc...
Il ne reste donc plus qu'� trouver une zone non utilis�e. ( zone
DATA ) Avec PCTOOLS on s'apercoit que le message d'origine - non
crypt� - est toujours pr�sent dans le fichier.( Message en Anglais
d'ASHTON TATE )
Un essai est vite fait en remplissant de "20" toute une zone et
d'essayer � nouveau le soft pour s'assurer qu'il fonctionne
toujours.
C'est le cas! Je remplace donc le CALL 35A2 par un CALL 0300 qui
saute dans ma zone de donn�es non utilis�es. J'y place un RETour et
je v�rifie si tout continue de fonctionner comme avant. Voil� le
plus dur est fait, maintenant ce n'est plus qu'une question de
quelques instructions en assembleur.
.
.
.
3755 POP AX
3756 CALL 0300 �������> CMP AX,002E ;je compare AX � 2Eh
3759 PUSH AX <������ͻ JBE 30C ;si plus petit ou �gal saut...
. � MOV w[3757],FE49 ;remplace le CALL 0300 par le
. � ;CALL d'origine en 35A2!....
. 30B �� RET ;retour
. 30C � MOV DX,0400 ;ici routine d'affichage
30F � MOV AH,09 ;personnel.
311 � INT 21 ;sortie d'une chaine de
313 � MOV AH,06 ;caract�res.
315 � XOR AL,AL
317 � NOP
318 � NOP
319 �� RET
Chaine personnelle en CS:0601h "Rapidfil version 1.1 modifi�"
et CS:DX 0400h " 80 espaces "
L'instruction MOV WORD PTR [3757],FE49 remet dans l'emplacement
m�moire 3757 et 3758 ( word ) la valeur HEXA 49FE qui correspond
� un saut relatif en 35A2. C'est � dire remet en place le saut
originel du programme pour �viter que par la suite le programme ne
soit perturb�.
Sans cette petite rectification le soft se plante lorsqu'on rajoute
un fichier � un autre d�j� en m�moire dans RF.
Note: Pour entrer des nombres HEXA avec TD il faut soit les faires
pr�c�der par 0 ou finir par h. Ceci seulement si le nombre contient
des lettres HEXA ABCDEF.
Voil� le travail......il ne reste plus qu'� r�p�ter la m�me chose
pour les versions plus r�centes.
M�thode pratique:
1) Avec PCTOOLS chercher la chaine:
2020202020202020BA01C8CDCDCDCDCDCD.....
Et remplacer par ( en commencant par le premier 20 )
3D2E00 ; Adresse 0300 h, c'est en fait la
7607 ; traduction des instructions ASM
C706573749FE ; tap�es plus haut.
C3 ; RET
BA0004
B409
CD21 ; INT 21
B406
32C0
9090 ; NOP 2 fois
C3 ; RET adresse 0319h
; Donc 26 octets � remplacer.
2) Rep�rer 6446696C6520206F... ( dfile on one computer...)
Placer ici � partir de 64 sa propre chaine ASCII qui sera
affich�e sur l'�cran � la place du message d'origine. A
partir du premier octet (64) on dispose de 80 caract�res.
Le premier caract�re inclu.
3) Rep�rer 6420415348544F4E.... ( d ASHTON-TATE...)
Placer ici 80 espaces suivi d'un $ (24h).
4) Pour terminer rep�rer E849FE50AD93FF27430A5337 et changer
les 2me et 3me octets par A7CB. ( CALL 0300 )
Freddy.
|